package com.flca.frw.validator
{
	import mx.validators.Validator;
	import mx.validators.ValidationResult;
	
	public class BanknrValidator extends Validator
	{
		private var results:Array;

		private const MAXIMUM_AANTAL_CIJFERS_POSTBANKNR:int = 7;
		private const AANTAL_CIJFERS_BANKNR:int = 9;
		private const ELF:int = 11;

		public function BanknrValidator() {
			super();
		}

	    override protected function doValidation(value : Object):Array {
		    // Clear results Array.
		    results = [];
		
		    // Call base class doValidation().
		    results = super.doValidation(value);        
		    if (results.length > 0) {
		        return results;
		    }
		    
		    // Voorlopig fout als niet met 1 begint
		    if (!validateNr(value as String)) {
		        results.push(
		        	new ValidationResult(true, null, "Bank/Giro", "is niet geldig."));
		        return results;
		    }
		    
		    return results;
		}

		private function validateNr(value:String) : Boolean {
			//Nu wordt de lengte van het rekeninnummer gecontroleerd. Hierbij worden
			//eerst alle voorloopnullen van het nummer afgehaald.
			var rekeningNummer:String = value.replace(/^0*/, value);
			//Controleer of het een postbanknummer is.
			if (rekeningNummer.length <= MAXIMUM_AANTAL_CIJFERS_POSTBANKNR) {
				return true;
			} else if (rekeningNummer.length == AANTAL_CIJFERS_BANKNR) {
				var calculation:int = 0;
				var counter:int = AANTAL_CIJFERS_BANKNR;
				while (counter > 0) {
					for (var j:int = 0; j < rekeningNummer.length; j++) {
						var c:String = rekeningNummer.charAt(j);
						calculation += (counter * int(c));
						counter--;
					}
				}
				if (calculation % ELF == 0) {
					return true;
				} else {
					return false;
				}
			} else {
				return false;
			}
		}
	}
}